package com.letao.server.controller;

import com.letao.server.dto.Result;
import com.letao.server.entity.SpuInfo;
import com.letao.server.entity.SpuMedia;
import com.letao.server.service.ISpuMediaService;
import com.letao.server.service.ISpuService;
import com.letao.server.service.IUploadService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * 用于处理文件上床
 */
@RequestMapping("/upload")
@Slf4j
@RestController
public class UploadController {

    @Resource
    private IUploadService uploadService;

    @Resource
    private ISpuMediaService spuMediaService;

    @Resource
    private ISpuService spuService;

    /**
     * 用于进行用户的头像上传操作
     * 接口等级: 管理员
     *
     * @param file 用户头像文件
     * @return 返回结果
     * @throws IOException 抛出的异常
     */
    @PostMapping("/userImage")
    private Result updateUserImage(@RequestBody MultipartFile file) throws IOException {
        // 判断图片类型是否正确
        String originalFilename = file.getOriginalFilename();
        // 判断文件是否存在
        if (originalFilename == null) {
            return Result.fail("文件不存在");
        }
        // 判断是否有扩展名
        int index = originalFilename.lastIndexOf(".");
        if (index == -1) {
            return Result.fail("文件错误");
        }
        String extension = originalFilename.substring(index);
        if (!(".jpg".equals(extension)) && !(".png".equals(extension))) {
            return Result.fail("文件类型错误");
        }
        return uploadService.updateUserImage(file);
    }

    /**
     * 上传sku的描述图片
     * 接口等级: 管理员
     *
     * @param file 图片文件
     * @param id   sku的Id
     * @return 返回的结果
     */
    @PostMapping("/skuImage/{id}")
    private Result updateSkuImage(@RequestBody MultipartFile file,
                                  @PathVariable("id") Long id) throws IOException {
        String filename = file.getOriginalFilename();
        if (filename == null) {
            return Result.fail("文件不存在");
        }
        int index = filename.lastIndexOf(".");
        if (index == -1) {
            return Result.fail("文件错误");
        }
        String extension = filename.substring(index);
        if (!(".jpg".equals(extension)) && !(".png".equals(extension))) {
            return Result.fail("文件类型错误");
        }
        return uploadService.updateSkuImage(file, id);
    }

    /**
     * 上传spu的描述图片或视频
     * 接口等级: 管理员
     *
     * @param file 图片或视频文件
     * @param id   spu的Id
     * @return 返回的结果
     */
    @PostMapping("/spuImage/{id}")
    private Result updateSpuImage(@RequestBody MultipartFile file,
                                  @PathVariable("id") Long id) throws IOException {
        String filename = file.getOriginalFilename();
        if (filename == null) {
            return Result.fail("文件不存在");
        }
        int index = filename.lastIndexOf(".");
        if (index == -1) {
            return Result.fail("文件错误");
        }
        String extension = filename.substring(index);
        if (!(".jpg".equals(extension)) && !(".png".equals(extension)) && !(".mp4".equals(extension))) {
            return Result.fail("文件类型错误");
        }
        return uploadService.updateSpuImage(file, id);
    }

    /**
     * 删除spu的描述图片
     * 接口等级: 管理员
     *
     * @param id 需要删除的图片的Id
     * @return 返回的结果
     */
    @DeleteMapping("/spuImage/{id}")
    private Result deleteSpuImage(@PathVariable("id") Long id) {
        return uploadService.deleteSpuImage(id);
    }

    /**
     * 修改spu描述图片的默认
     * 接口等级: 管理员
     *
     * @param id 默认图片的Id
     * @return 返回的结果
     */
    @PutMapping("/spuImage/{id}")
    private Result changeDefault(@PathVariable("id") Long id) {
        SpuMedia media = spuMediaService.getById(id);
        if (media == null) {
            return Result.fail("对象不存在");
        }
        if (media.getMediaType() == 2) {
            return Result.fail("默认依赖错误");
        }
        SpuMedia one = spuMediaService.query().eq("spu_id", media.getSpuId()).eq("is_default", 1).one();
        media.setIsDefault(1);
        SpuInfo spu = spuService.getById(media.getSpuId());
        spu.setSpuImage(media.getMediaUrl());
        spuService.updateById(spu);
        one.setIsDefault(0);
        spuMediaService.updateById(one);
        spuMediaService.updateById(media);
        return Result.success();
    }

    @GetMapping("/spuImage/{id}")
    public Result getSpuImage(@PathVariable Long id) {
        List<SpuMedia> list = spuMediaService.query().eq("spu_id", id).list();
        return Result.success(list);
    }

    @PostMapping("/seckill/{id}")
    public Result uploadSeckillImage(@RequestBody MultipartFile file,
                                     @PathVariable("id") Long id) throws IOException {
        String filename = file.getOriginalFilename();
        if (filename == null) {
            return Result.fail("文件不存在");
        }
        int index = filename.lastIndexOf(".");
        if (index == -1) {
            return Result.fail("文件错误");
        }
        String extension = filename.substring(index);
        if (!(".jpg".equals(extension)) && !(".png".equals(extension))) {
            return Result.fail("文件类型错误");
        }
        return uploadService.updateSeckillImage(file, id);
    }
}
